/**
 * create by zy 88377761
 */
package com.example.demo.util;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SimpleTimeZone;
import java.util.TimeZone;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author 88377761 数据类型转换工具类
 */
public class ConverterUtil {
	private ConverterUtil() {
	}

	private static final Logger log = LoggerFactory.getLogger(ConverterUtil.class);

	/**
	 * <将obj转换为string，如果obj为null则返回defaultVal>
	 * 
	 * @param obj
	 *            需要转换为string的对象
	 * @param defaultVal
	 *            默认值
	 * @return obj转换为string
	 */
	public static String toString(Object obj, String defaultVal) {
		return (obj != null) ? obj.toString() : defaultVal;
	}

	/**
	 * <将obj转换为string，默认为空>
	 * 
	 * @param obj
	 *            需要转换为string的对象
	 * @return 将对象转换为string的字符串
	 */
	public static String toString(Object obj) {
		return toString(obj, "");
	}

	/**
	 * <将对象转换为int>
	 * 
	 * @param obj
	 *            需要转换为int的对象
	 * @param defaultVal
	 *            默认值
	 * @return obj转换成的int值
	 */
	public static Integer toInt(Object obj, Integer defaultVal) {
		try {
			return (obj != null) ? Integer.valueOf(toString(obj, "0")) : defaultVal;
		} catch (Exception e) {
			log.error("", e);
		}
		return defaultVal;
	}

	/**
	 * <将对象转换为int>
	 * 
	 * @param obj
	 *            需要转换为int的对象
	 * @param defaultVal
	 *            默认值
	 * @return obj转换成的int值
	 */
	public static Integer toInt(Object obj) {
		return toInt(obj, 0);
	}

	/**
	 * <将对象转换为Integer>
	 * 
	 * @param obj
	 *            需要转换为Integer的对象
	 * @return obj转换成的Integer值
	 */
	public static Integer toInteger(Object obj) {
		return toInt(obj, null);
	}

	/**
	 * <将对象转换为int>
	 * 
	 * @param obj
	 *            需要转换为int的对象
	 * @param defaultVal
	 *            默认值
	 * @return obj转换成的int值
	 */
	public static Float toFloat(Object obj, float defaultVal) {
		return (StringUtils.isNotBlank(toString(obj))) ? Float.parseFloat(toString(obj, "0")) : defaultVal;
	}

	/**
	 * <将对象转换为Float>
	 * 
	 * @param obj
	 *            需要转换为Float的对象
	 * @return obj转换成的Float值
	 */
	public static Float toFloat(Object obj) {
		return toFloat(obj, 0);
	}

	/**
	 * <将obj转换为long>
	 * 
	 * @param obj
	 *            需要转换的对象
	 * @param defaultVal
	 *            默认值
	 * @return 如果obj为空则返回默认，不为空则返回转换后的long结果
	 */
	public static Long toLong(Object obj, Long defaultVal) {
		return (obj != null) ? Long.valueOf(toString(obj)) : defaultVal;
	}

	/**
	 * <将obj转换为long>
	 * 
	 * @param obj
	 *            需要转换的对象
	 * @return 如果obj为空则返回默认的0l，不为空则返回转换后的long结果
	 */
	public static Long toLong(Object obj) {
		return toLong(obj, 0l);
	}

	/**
	 * 将object转换为double类型，如果出错则返回 defaultVal
	 * 
	 * @param obj
	 *            需要转换的对象
	 * @param defaultVal
	 *            默认值
	 * @return 转换后的结果
	 */
	public static Double toDouble(Object obj, Double defaultVal) {
		try {
			return Double.parseDouble(obj.toString());
		} catch (Exception e) {
			log.error("", e);
		}
		return defaultVal;
	}

	/**
	 * 将object转换为double类型，如果出错则返回 0d
	 * 
	 * @param obj
	 *            需要转换的对象
	 * @return 转换后的结果
	 */
	public static Double toDouble(Object obj) {
		return toDouble(obj, 0d);
	}

	/**
	 * <将List<Object>转换为List<Map<String, Object>>>
	 * 
	 * @param list
	 *            需要转换的list
	 * @return 转换的结果
	 */
	@SuppressWarnings("unchecked")
	public static List<Map<String, Object>> converterForMapList(List<Object> list) {
		List<Map<String, Object>> result = new ArrayList<>();
		for (Object tempObj : list) {
			result.add((HashMap<String, Object>) tempObj);
		}
		return result;
	}

	/**
	 * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
	 * 
	 * @param strDate
	 * @return
	 * @throws ParseException
	 */
	public static Date toDate(String strDate, String format) throws ParseException {
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		Date strtodate = formatter.parse(strDate);
		return strtodate;
	}

	/**
	 * 只适用雷速时间（非0）转换
	 * 
	 * @param timestamp
	 * @return create by zy 88377761
	 */
	public static Date toDate(Long timestamp) {
		if (timestamp == null || timestamp == 0L)
			return null;
		Long timestamp2 = timestamp;
		if (timestamp.toString().length() < 11)
			timestamp2 = timestamp * 1000;
		return new Date(timestamp2);
	}

	/**
	 * 
	 * @param date
	 * @param field
	 *            Calendar.YEAR
	 * @param amount
	 * @return create by zy 88377761
	 */
	public static Date add(Date date, int field, int amount) {
		Calendar ca = Calendar.getInstance();// 得到一个Calendar的实例
		ca.setTime(date); // 设置时间为当前时间
		ca.add(field, amount);
		return ca.getTime();
	}

	/**
	 * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
	 * 
	 * @param dateDate
	 * @return
	 */
	public static String toDateStr(Date dateDate, String format) {
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		String dateString = formatter.format(dateDate);
		return dateString;
	}

	/**
	 * 获取区时 此函数非原创，从网上搜索而来，timeZoneOffset原为int类型
	 * timeZoneOffset表示时区，如中国一般使用东八区，因此timeZoneOffset就是8
	 * 
	 * @param timeZoneOffset
	 * @return
	 */
	public static String getDateStringByTimeZone(int timeZoneOffset) {
		int newTime = timeZoneOffset * 60 * 60 * 1000;
		TimeZone timeZone;
		String[] ids = TimeZone.getAvailableIDs(newTime);
		if (ids.length == 0) {
			timeZone = TimeZone.getDefault();
		} else {
			timeZone = new SimpleTimeZone(newTime, ids[0]);
		}

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		sdf.setTimeZone(timeZone);
		return sdf.format(new Date());
	}

	/**
	 * 根据经度获取当地时间
	 * 
	 * @param longitude
	 * @return
	 * @throws ParseException
	 */
	public static String getDateStringByLongitude(float longitude) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Calendar calendar = Calendar.getInstance();
		try {
			calendar.setTime(format.parse(getDateStringByTimeZone(8)));
		} catch (ParseException e) {
			log.error("", e);
			return null;
		}
		int offest = toDouble(Math.ceil((longitude - 120) / 15 * 60 * 60)).intValue();
		calendar.add(Calendar.SECOND, offest);
		return format.format(calendar.getTime());
	}

	/**
	 * 格式化小数
	 * 
	 * @param format
	 *            doublepi=3.1415927; //圆周率 //取一位整数
	 *            System.out.println(newDecimalFormat("0").format(pi)); //3
	 *            取一位整数和两位小数
	 *            System.out.println(newDecimalFormat("0.00").format(pi)); //3.14
	 *            取两位整数和三位小数，整数不足部分以0填补。 System.out.println(new
	 *            DecimalFormat("00.000").format(pi));// 03.142 //取所有整数部分
	 *            System.out.println(newDecimalFormat("#").format(pi)); //3
	 *            以百分比方式计数，并取两位小数 System.out.println(new
	 *            DecimalFormat("#.##%").format(pi)); //314.16%
	 * @return
	 * @throws ParseException
	 */
	public static String formatNumber(Object number, String format) {
		DecimalFormat df = new DecimalFormat(format);
		return df.format(number);
	}
}
